/*
 * chat_types.h
 *
 *  Created on: 2012-6-27
 *      Author: rendong
 */

#ifndef CHAT_TYPES_H_
#define CHAT_TYPES_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/epoll.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

#include "chat_hash.h"
#include "chat_list.h"

typedef struct _chat_server_config_s chat_server_config_t;
typedef struct _chat_session_s chat_session_t;
typedef struct _chat_send_item_s chat_send_item_t;

#define INT32_LEN 4
#define INT16_LEN 2

#define ERROR_TYPE_DUPLOGIN 1
#define ERROR_TYPE_NOTLOGIN 2

#define SIZE_REQ_TIME 256
#define SIZE_LOG_BUFFER 1024


/**
 * 新连接处理
 */
typedef void (*chat_epoll_handler_new_t)(int fd, struct sockaddr_in *clientaddr, chat_server_config_t *config);

/**
 * 读取数据
 * @buffer 缓冲
 */
typedef void (*chat_epoll_handler_read_t)(chat_session_t *session);


/**
 * 主动断开连接
 */
typedef void (*chat_epoll_handler_close_t)(int fd, chat_server_config_t * config);

#define LOGIN_TYPE_USER 1
#define LOGIN_TYPE_ADMIN 2

// session定义
struct _chat_session_s{
	int sockfd;
	struct sockaddr_in *clientaddr;
	chat_server_config_t * config;

	char *read_buffer;
	int read_buffer_size;
	int read_buffer_data_size;

	char *uid;
	char *nickname;
	short login_type;

	int friend_len;
	char ** friend_list;

	int channel_name_size;
	char ** channel_name_list;

	chat_send_item_t * send_head;
	chat_send_item_t * send_last;

	int flag_close;
	time_t heart_time;

	time_t login_time;
};


// 发送链表
struct _chat_send_item_s{
	char * buffer;
	int buffer_data_size;// 已经发送的大小
	int buffer_size;// 总buff大小
	int is_free;

	chat_send_item_t * next;
};

// epoll 设置
struct _chat_server_config_s{
	char * srv_addr;				// 监听的本地地址
	int    srv_port;				// 监听的端口
	int    cfg_max_clients;		// 最多允许连接的客户数

	int    srv_epfd;				// epoll 文件描述符
	int    cur_clients;			// 当前连接的客户数
	int    chat_log_fd;			// 日志文件fd
	int    chat_phplog_fd;			// 日志文件fd 记录php的消息

	int 	stat_max_clients;		// 最高同时在线数量
	int 	stat_max_fd;			// 最大的连接fd
	int 	stat_last_fd;			// 最后连接的fd

	chat_epoll_handler_new_t handler_new;		// 有新连接处理函数
	chat_epoll_handler_read_t handler_read;	// 数据读取
	chat_epoll_handler_close_t handler_close;	// 连接断开

	chat_session_t ** fd_sessions;	// fd => session记录
	chat_hash_table_t *uid_sessions;// uid => session记录
	chat_hash_table_t *all_channel;// channel_name => chat_list ( session, session )

	chat_hash_table_t *uid_disable;// 禁言用户

	char *s_req_time; // 当前请求时间
	time_t t_req_time;
	int len_req_time;
};

// 用户禁言
typedef struct _chat_disable_user_s{
	int time;// 禁言 时间，单位：秒
	time_t now; // 禁言时的时间
}chat_disable_user_t;

#endif /* CHAT_TYPES_H_ */
